package com.guaoran.micro.services.spring.boot.auto.configuraton;

import com.guaoran.micro.services.spring.boot.auto.configuraton.enable.EnableScheduleAndCache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.ApplicationContext;

/**
 * @author : guaoran
 * @Description 自动装配
 *
 * @README springboot 中实现自动装配
 *
 * @one 方式一(starter) 通过在 META-INF/spring.factories 中配置要自动配置的类 {@link EnableAutoConfiguration} 中配置对应的自动配置类路径
 * @one 并且可以根据注解 {@link ConditionalOnClass} 、{@link ConditionalOnMissingClass} 等等来根据具体的条件进行过滤是否加载某个配置类
 * @oneTest 测试方法是：引用对应的 starter ，并根据注解条件中的所需依赖进行增删，通过获得引用starter 的上下文中是否出现对应的bean 即可看出
 *
 * @two 方式二(starter) 通过在 META-INF/spring.factories 中配置要自动配置的类 {@link EnableAutoConfiguration} 中配置对应的自动配置类路径
 * @two 并且在 META-INF/spring-autoconfigure-metadata.properties 中配置对应的加载条件即可，同条件注解相似
 * @twoTest 测试方法同方式一
 *
 * @date :2019/7/4 21:32
 */
@SpringBootApplication
@EnableScheduleAndCache
public class SpringBootAutoConfigurationApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringBootAutoConfigurationApplication.class,args);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String bean : beanDefinitionNames){
            System.out.println(bean);
        }
    }
}
